﻿#pragma once

#include <QFile>
#include <QTabWidget>
#include <Global.h>

namespace Domy {

class TextEditorWidget;
class NodeEditorWidget;
class GraphicsEditorWidget;
class PreviewWidget;

/**
 * @brief The XMLCoreEditor class
 * @note  编辑器标签页
 */
class XMLCoreEditor : public QTabWidget
{
    Q_OBJECT
public:
    explicit XMLCoreEditor(QWidget *parent = Q_NULLPTR);
    ~XMLCoreEditor();

    /**
     * @brief getPlainText
     * @note  获取文本
     */
    QByteArray getPlainText() const;

    /**
     * @brief getLineText
     * @note  获取某行文本
     * @param line 行号
     */
    QString getLineText(int line) const;

    /**
     * @brief openFile
     * @note  打开文件
     * @param file_path 文件路径
     */
    bool openFile(const QString &file_path);

    /**
     * @brief setFilePath
     * @note  设置文件路径
     * @param file_path 文件路径
     */
    void setFilePath(const QString &file_path);

    /**
     * @brief getFilePath
     * @note  获取文件路径
     */
    QString getFilePath() const;

    /**
     * @brief getFileName
     * @note  获取文件名
     */
    QString getFileName() const;

    /**
     * @brief save
     * @note  保存
     */
    bool save(QString * const error = Q_NULLPTR);

    /**
     * @brief saveAs
     * @note  另存为
     */
    bool saveAs(const QString &file_path, QString * const error = Q_NULLPTR);

    /**
     * @brief isChanged
     * @note  内容是否已改变
     */
    bool isChanged() const;

    /**
     * @brief setErrorLineHighlight
     * @note  设置错误行高亮
     */
    void setErrorLineHighlight(int line);

    /**
     * @brief clearErrorLineHighlight
     * @note  清除错误行高亮
     */
    void clearErrorLineHighlight();

    /**
     * @brief isUndoEnable
     * @note  获取undo是否可用
     */
    bool isUndoEnable() const;

    /**
     * @brief isRedoEnable
     * @note  获取redo是否可用
     */
    bool isRedoEnable() const;

    /**
     * @brief doEditAction
     * @note  触发编辑动作
     */
    void doEditAction(ActionKey key);

    /**
     * @brief updateSettings
     * @note  更新设置
     */
    void updateSettings();

signals:
    void signalContentTextChanged();
    void signalContentModificationChanged();
    void signalFilePathChanged();
    void signalRedoAvailable(bool availabel);
    void signalUndoAvailable(bool available);

private slots:
    void slotOnCurrentEditorIndexChanged(int index);
    void slotOnContentModificationChanged(bool is_changed);
    void slotOnReload();

private:
    void createEditor(int index);
    bool save(const QString &file_path, QString * const error = Q_NULLPTR);

private:
    TextEditorWidget     *m_text_editor;
    NodeEditorWidget     *m_node_editor;
    GraphicsEditorWidget *m_graphics_editor;
    PreviewWidget        *m_preview_widget;

    bool                  m_is_changed;
    QString               m_file_path;
};

} // namespace Domy
